﻿package
{
	import flash.display.MovieClip;
	
	public class ContentDisplayer
	{
		//VARIABLES INTERNAS SETEABLES OBLIGATORIAS.
			
			public var formClip:MovieClip; //CLIP QUE CONTIENE LOS ELEMENTOS DEL ContentDisplayer.
			public var itemArray:Array = []; //ARRAY DE CLIPS QUE SERAN LOS ITEMS DEL ContentDisplayer.
		
		//VARIABLES INTERNAS SETEABLES OPCIONALES.
		
			public var direction:String = "vertical"; //DIRECCION EN LA QUE SE SCROLEARIA EL CONTENIDO EN CASO DE QUE HAYA SOBRANTES.
			public var hSpacing:Number = 5; //ESPACIAMIENTO HORIZONTAL ENTRE LOS ITEMS.
			public var vSpacing:Number = 5; //ESPACIAMIENTO VERTICAL ENTRE LOS ITEMS.
			public var hOffset:Number = 10; //OFFSET HORIZONTAL DEL CONTENIDO.
			public var vOffset:Number = 10; //OFFSET VERTICAL DEL CONTENIDO.
			public var fitBox:Boolean = true; //DETERMINA SI SE AJUSTA EL BOX AL CONTENIDO.
		
		//VARIABLES INTERNAS.
		private var contentHolder:MovieClip;
		private var mascara:MovieClip;
		private var W:Number;
		private var H:Number;
		private var w:Number;
		private var h:Number;
		
		//CONSTRUCTOR.
		public function ContentDisplayer()
		{
			
		}
		
		//INIT.
		public function init():void
		{
			//INICIALIZA EL HOLDER.
			contentHolder = new MovieClip;
			contentHolder.name = "contentHolder";
			formClip.addChild(contentHolder);
			
			//INICIALIZA LA MASCARA.
			mascara = new MovieClip;
			mascara.x = hOffset;
			mascara.y = vOffset;
			mascara.graphics.beginFill(0x00FF00, 0.25);
			mascara.graphics.drawRect(0, 0, formClip.box.width - 2*hOffset, formClip.box.height - 2*vOffset);
			mascara.graphics.endFill();
			formClip.addChild(mascara);
			
			//SETEA LA MASCARA.
			contentHolder.mask = mascara;
			
			//TRANSFIERE LOS CLIPS AL HOLDER.
			for (var i:uint; i < itemArray.length; i++ )
				contentHolder.addChild(itemArray[i]);
				
			//POSICIONA LOS CLIPS.
			placeClips();
			
			//AJUSTA.
			if (fitBox)
				fit();
				
			//ARMA UN BOX INVISIBLE EN EL CONTENTHOLDER (ESENCIAL PARA EL SCROLLING).
			setContentBox();
		}
		
		//POSICIONA LOS CLIPS.
		private function placeClips():void
		{
			//DETERMINA LAS DIMENSIONES DE UN ITEM.
			W = itemArray[0].width;
			H = itemArray[0].height;
			
			//DETERMINA CUANTOS ITEMS ENTRARIAN EN CADA DIRECCION.
			w = Math.floor((-hOffset + formClip.box.width) / (itemArray[0].width + hSpacing));
			h = Math.floor(( -vOffset + formClip.box.height) / (itemArray[0].height + hSpacing));
			
				//GUARDA ESTAS VARIABLES EN EL FORMCLIP (UTIL PARA ALGUNOS TIPOS DE SCROLLING).
				formClip.itemW = W + hSpacing;
				formClip.itemH = H + vSpacing;
				formClip.scrollPageW = w;
				formClip.scrollPageH = h;
			
			//LIBERA EL QUE NO SE APLICA A LA DIRECCION.
			w = direction == "horizontal" ? 999999 : w;
			h = direction == "vertical" ? 999999 : h;
			
			//POSICIONA LOS ITEMS.
			var xx:uint;
			var yy:uint;
			for (var i:uint; i < itemArray.length; i++ )
			{
				//DETERMINA DOS VALORES QUE SE UTILIZAN PARA POSICIONAR.
				if (direction == "vertical")
				{
					xx = i % w;
					yy = Math.floor(i / w) % h;
				}
				else
				{
					yy = i % h;
					xx = Math.floor(i / h) % w;
				}
				
				//POSICIONA.
				itemArray[i].x = hOffset + xx * (W + hSpacing);
				itemArray[i].y = vOffset + yy * (H + vSpacing);
			}
		}
		
		//AJUSTA EL BOX AL CONTENIDO.
		private function fit():void
		{
			//AJUSTA EL BOX.
			formClip.box.width = direction == "vertical" ? 2*hOffset + (itemArray[0].width + hSpacing) * w - hSpacing : formClip.box.width;
			formClip.box.height = direction == "horizontal" ? 2 * vOffset + (itemArray[0].height + vSpacing) * h - vSpacing : formClip.box.height;
			
			//AJUSTA LA MASCARA.
			mascara.width = formClip.box.width - 2*hOffset;
			mascara.height = formClip.box.height- 2*vOffset;
		}
		
		//ARMA UN BOX INVISIBLE EN EL CONTENTHOLDER (ESENCIAL PARA EL SCROLLING).
		private function setContentBox():void
		{
			//DETERMINA LAS DIMENSIONES.
			var wid:Number = direction == "vertical" ? 2*hOffset + (itemArray[0].width + hSpacing) * w - hSpacing : contentHolder.width + 2*hOffset;
			var hei:Number = direction == "horizontal" ? 2 * vOffset + (itemArray[0].height + vSpacing) * h - vSpacing : contentHolder.height + 2*vOffset;
			
			//DIBUJA EL BOX.
			contentHolder.graphics.beginFill(0x00FFFF, 0);
			contentHolder.graphics.drawRect(0, 0, wid, hei);
			contentHolder.graphics.endFill();
		}
		
		//INFO.
		public function info():void
		{
			var str:String = "ContentDisplayer v1.0" + String.fromCharCode(13);
			str += "---------------" + String.fromCharCode(13);
			str += "VARIABLES SETEABLES OBLIGATORIAS:" + String.fromCharCode(13);
			str += "formClip:MovieClip" + String.fromCharCode(13);
			str += "itemArray:Array" + String.fromCharCode(13);
			str += "---------------" + String.fromCharCode(13);
			str += "VARIABLES SETEABLES OPCIONALES:" + String.fromCharCode(13);
			str += "direction:String [default = vertical]" + String.fromCharCode(13);
			str += "hSpacing:Number [default = 5]" + String.fromCharCode(13);
			str += "vSpacing:Number [default = 5]" + String.fromCharCode(13);
			str += "hOffset:Number [default = 10]" + String.fromCharCode(13);
			str += "vOffset:Number [default = 10]" + String.fromCharCode(13);
			str += "fitBox:Boolean [default = true]" + String.fromCharCode(13);
			str += "---------------" + String.fromCharCode(13);
			str += "NOTAS:" + String.fromCharCode(13);
			str += "Requiere que los items sean previamente tirados al escenario y asociados a un array que se le pasa." + String.fromCharCode(13);
			str += "Requiere que tambien haya en el escenario un clip que lo represente. Este tiene que contener un clip llamado box." + String.fromCharCode(13);
			str += "Para definir filas y columnas, modificar el tamanio del box, dentro del clip que lo representa." + String.fromCharCode(13);
			str += "---------------";
			trace(str);
		}
	}
}